package com.java.queue;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * @author wangning
 * @date 2023/5/15 17:38
 * 阻塞队列：
 *  ArrayBlockingQueue：是一个基于数组结构的有界阻塞队列，此队列按FIFO（先进先出）原则对元素进行排序
 *  LinkedBlockingDeque：是一个基于链表的阻塞队列，此队列按照FIFO（先进先出）排序元素，吞吐量通常要高于ArrayBlockingQueue
 *  SynchronousQueue：一个不存储元素的阻塞队列，每个插入操作必须等到另一个线程调用移除操作，否则插入操作一直处于阻塞转态，吞吐量通常高于LinkedBlockingDeque
 *  SynchronousQueue参考奢侈品，不下单不生产
 * 1.队列
 *
 * 2.阻塞队列，例如去吃饭，座位满了，在等候区等待
 * 2.1 阻塞队列有没有好的一面
 * 2.2 不得不阻塞，你如何管理
 *
 * 当阻塞队列是空时，从队列中获取元素的操作将会被阻塞
 * 当阻塞队列是满时，往队列里添加元素的操作将会被阻塞
 * add/remove 抛出异常
 * off
 *
 *
 */
public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
//        List list = new ArrayList();
        //抛出异常组
        BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
//        blockingQueue.add("a");
//        blockingQueue.add("b");
//        blockingQueue.add("c");
//        System.out.println(blockingQueue.element());//队首元素
//        System.out.println(blockingQueue.add("d"));
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());
//        System.out.println(blockingQueue.remove());

        //特殊值组offer/poll peek
//        System.out.println(blockingQueue.offer("a"));
//        System.out.println(blockingQueue.offer("b"));
//        System.out.println(blockingQueue.offer("c"));
//        System.out.println(blockingQueue.offer("d"));//false
//        System.out.println(blockingQueue.peek());//队首元素
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());
//        System.out.println(blockingQueue.poll());//null

        // 阻塞 put/take
//        blockingQueue.put("a");
//        blockingQueue.put("b");
//        blockingQueue.put("c");

//        blockingQueue.put("d");//满了然后一直等待
//        blockingQueue.take();
//        blockingQueue.take();
//        blockingQueue.take();
//        blockingQueue.take();//如果为空一直等待

        // 超时 offer/poll
        System.out.println(blockingQueue.offer("a", 2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.offer("a", 2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.offer("a", 2, TimeUnit.SECONDS));
//        System.out.println(blockingQueue.offer("a", 2, TimeUnit.SECONDS));//false

        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));
//        System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS));//null
    }
}













